//============================================================================
// Nome        : Empresa.cpp
// Autores     : T1G7
//                                      Felipe Galvão do Espírito Santo
//                                      Ivanilda Maísa Costa Brazão de Almeida
//                                      Paulo Jorge de Faria dos Reis
// Versão      : 1.0
// Data        : Maio de 2011
// Copyright   : Creative Commons 2.0
// Descrição   : CAL 2011 - TG1
//               Tema 12 - Transporte de pacientes de uma clínica de saúde.
//============================================================================

#ifndef EMPRESA_H_
#define EMPRESA_H_

#include <cstdio>
#include <queue>
#include <vector>
#include <string>
#include <math.h>
#include "mapas.h"
#include "graphviewer.h"
#include "Sucursal.h"
#include "Consultas.h"
#include "Interfaces.h"
#include "Dados.h"
#include "Cliente.h"
#include "Auxiliar.h"
#include "DataCal.h"
#include "Graph.h"

using std::string;
//! Toda a lógica aplicacional reside nesta classe.
/*!
 *	Estrutura do sistema de Menus:
 *	O sistema de Menus é composto de uma função por cada página de opções, nessa função é criado o texto (1), realizada
 *	uma pergunta (2) e processado o resultado (3). É realizada a opção selecionada.
 *	Todos os Menus são chamados de forma mutuamente recursiva, portanto ao regressar de uma função regressa-se ao menu anterior.
 *
 * (1)
 *  vector<string> aMostrar;	// Vector para colecionar as linhas do menu a apresentar.
 *  string confirma;			// Para receber a resposta do utilizador.
 *  aMostrar.push_back(string opcoes);		// Cada linha do menu é acrescentada com este código.
 *  iTex.menuNaConsola(aMostrar, '|', '-');	// Instrução para apresentar o menu previamente construido.
 *  aMostrar.clear();						// Limpar o vector para futura utilização.
 *
 *  (2)
 *  confirma = textos.smsRetorno(string pergunta);	// Pergunta ao utilizador a sua opção e recebe a resposta.
 *
 *  (3)
 *  Executar a opção do utilizador chamando uma nova função.
 *
 */
class Empresa
{
public:
	//! Funções públicas.
	Empresa(string arquivo, int permissoes = 1);	//! O construtor precisa de saber qual o ficheiro de arquivo dos dados. Valor por defeito 1.
	~Empresa();
	int iniciar();					//! Inicio da aplicação. Lança a interface com o utilizador.
	void terminar();				//! Termina a aplicação, gravando antes os dados para ficheiro.

	//! TODO Funções que chamam as interfaces e processam as opções dos utilizadores da aplicação.

	void gestaoClientes();
	void gestaoVeiculos();
	void gestaoSucursal();
	void gestaoConsultas();
	void gestaoRotas();

	//! Funções relativas a Clientes.
	void registarCliente();
	void alterarCliente();
	void desativarCliente();
	void consultarCliente();

	//! Funções relativas a Veiculos.
	void capacidadeVeiculo();
	void clientesAlocados();
	void sucursalAssociado();

	//! Funções relativas as Sucursais.
	void listaClientes();
	void veiculoAssociado();
	void desativarSucursal();

	//! Funções relativas as Consultas.
	void dadosCliente();

   //! Funções relativas a Rotas.
	void algoritmo1();
	void algoritmo2();
	void algoritmo3();

	//! Visualização.
	void apresentaRota();


//! Dados privados
private:
    static unsigned int instancias;	//! Quantidade de instâncias que estão a ser executadas.
    unsigned int instancia;			//! ID da inst�ncia corrente.
    Interfaces iTex;				//! Está na moda as palavras começadas por i... a sério: significa Interface em Texto.
    Dados iData;					//! Interface de dados.
    friend class Interfaces;		//! A classe de Interface deve conseguir aceder aos dados de Aplicação
    string arquivo;					//! Nome do ficheiro, importante guardar para mais tarde guardar as alterações

};
#endif /* EMPRESA_H_ */

/* Template para Menu
 * vector<string> aMostrar;
 * string confirma;
 * int indice;
 *
 * aMostrar.push_back(string opcoes);
 * iTex.menuNaConsola(aMostrar, '|', '-');
 * aMostrar.clear();
 *
 * confirma = textos.smsRetorno(string pergunta);
 * indice = stringParaInteiro(confirma) - 1;
 * */
